草庐IT

c++ - Visual C++ volatile

全部标签

c++ - “qualifier”是什么意思?

“qualifier”的含义是什么?“qualifier”和“keyword”之间的区别是什么?对于C语言中的volatile限定词,我们可以说volatile是一个关键字,那么“qualifier”的含义是什么? 最佳答案 限定词添加了额外的“质量”,例如指定变量的易变性或常数。它们类似于形容词:“一个善变的人”,“一个易变的int”,“一个廉洁的女人”,“一个constdouble”。使用或不使用限定符,变量本身仍占据相同的内存量,并且每个位对状态/值的解释或贡献相同。限定符仅指定有关如何访问或存储它的内容。关键字是预定义的保留

C++ volatile 放置 新

如何对volatile指针执行放置新操作。例如,我想做这样的事情:volatileSomeStructObject;volatileSomeStruct*thing=&Object;new(thing)SomeStruct(/*argumentstoSomeStruct'sconstructor*/);我知道如果没有volatile关键字,这会起作用......但是我如何使用volatile变量来做到这一点?注意:Placementnew是这样定义的:void*operatornew(size_tmemoryRequested,void*pointer){returnpointer;}

C++ volatile 放置 新

如何对volatile指针执行放置新操作。例如,我想做这样的事情:volatileSomeStructObject;volatileSomeStruct*thing=&Object;new(thing)SomeStruct(/*argumentstoSomeStruct'sconstructor*/);我知道如果没有volatile关键字,这会起作用......但是我如何使用volatile变量来做到这一点?注意:Placementnew是这样定义的:void*operatornew(size_tmemoryRequested,void*pointer){returnpointer;}

c++ - 基准测试、代码重新排序、 volatile

我决定要对特定函数进行基准测试,所以我天真地编写了这样的代码:#include#includeintSlowCalculation(intinput){...}intmain(){std::cout一位同事指出,我应该将start和stop变量声明为volatile以避免代码重新排序。例如,他建议优化器可以像这样有效地重新排序代码:std::clock_tstart=std::clock();std::clock_tstop=std::clock();intanswer=SlowCalculation(42);起初我怀疑这种极端的重新排序是否被允许,但经过一些研究和实验后,我了解到确实

c++ - 基准测试、代码重新排序、 volatile

我决定要对特定函数进行基准测试,所以我天真地编写了这样的代码:#include#includeintSlowCalculation(intinput){...}intmain(){std::cout一位同事指出,我应该将start和stop变量声明为volatile以避免代码重新排序。例如,他建议优化器可以像这样有效地重新排序代码:std::clock_tstart=std::clock();std::clock_tstop=std::clock();intanswer=SlowCalculation(42);起初我怀疑这种极端的重新排序是否被允许,但经过一些研究和实验后,我了解到确实

c++ - 在 x86 中增加一个整数原子吗?

这个问题在这里已经有了答案:Cannum++beatomicfor'intnum'?(13个回答)关闭6年前。在多核x86机器上,假设在core1上执行的线程递增一个整数变量a,同时core2上的线程也递增它。假设a的初始值为0,那么它最终会不会是2呢?或者它可能有其他值(value)?假设a被声明为volatile并且我们没有使用原子变量(例如C++的atomic和gcc中内置的原子操作)。如果在这种情况下a的值确实总是2,这是否意味着x86-64中的longint也将具有相同的属性,即就是说,a到底总是2? 最佳答案 X86上的

c++ - 在 x86 中增加一个整数原子吗?

这个问题在这里已经有了答案:Cannum++beatomicfor'intnum'?(13个回答)关闭6年前。在多核x86机器上,假设在core1上执行的线程递增一个整数变量a,同时core2上的线程也递增它。假设a的初始值为0,那么它最终会不会是2呢?或者它可能有其他值(value)?假设a被声明为volatile并且我们没有使用原子变量(例如C++的atomic和gcc中内置的原子操作)。如果在这种情况下a的值确实总是2,这是否意味着x86-64中的longint也将具有相同的属性,即就是说,a到底总是2? 最佳答案 X86上的

c++ - volatile 成员函数的性能后果

我找到了一篇关于Dobbs博士的2001年文章:volatile-MultithreadedProgrammer'sBestFriend.我总是发现'volatile'有点没用-至少作为变量的限定符-因为访问线程之间共享的变量总是要通过某种库层。尽管如此,将类实例和方法标记为“volatile”以表明它们在文章中介绍的线程安全程度似乎非常引人注目。为了快速总结这篇文章,核心思想是可以这样声明一个类:structSomeObject{voidSingleThreadedMethod();voidMethod();voidMethod()volatile;};然后,类的实例,如下所示://

c++ - volatile 成员函数的性能后果

我找到了一篇关于Dobbs博士的2001年文章:volatile-MultithreadedProgrammer'sBestFriend.我总是发现'volatile'有点没用-至少作为变量的限定符-因为访问线程之间共享的变量总是要通过某种库层。尽管如此,将类实例和方法标记为“volatile”以表明它们在文章中介绍的线程安全程度似乎非常引人注目。为了快速总结这篇文章,核心思想是可以这样声明一个类:structSomeObject{voidSingleThreadedMethod();voidMethod();voidMethod()volatile;};然后,类的实例,如下所示://

c++ - 通过访问函数访问共享内存是否需要 `volatile`?

[edit]对于背景阅读,要清楚,这就是我所说的:Introductiontothevolatilekeyword在查看嵌入式系统代码时,我看到的最常见错误之一是线程/中断共享数据的volatile遗漏。但是我的问题是,当通过访问函数或成员函数访问变量时,不使用volatile是否“安全”?一个简单的例子;在下面的代码中...volatileboolflag=false;voidThreadA(){...while(!flag){//Wait}...}interruptvoidInterruptB(){flag=true;}...变量flag必须是volatile以确保不会优化Thre